.TH XXD 1 "August 1996" "Manual page for xxd"

.\"
.\" 21st May 1996
.\" Man page author:
.\"    Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
.\"    Changes by Bram Moolenaar <Bram@vim.org>

.SH NAME
.I xxd
\- 以十六进制形式表示

.SH "总览 (SYNOPSIS)"
.B xxd
\-h[elp]
.br
.B xxd
[options] [infile [outfile]]
.br
.B xxd
\-r[evert] [options] [infile [outfile]]

.SH "描述 (DESCRIPTION)"
.I xxd
建立一个指定文件或者标准输入的十六进制转储，同时也可以
把十六进制转储转换成原来的二进制形式。同
.BR uuencode(1)
和
.BR uudecode(1)
一样，它也可以把二进制数据转换成 ASCII 表示形式，这样电子邮件就可以
安全的传输。但是它有一个优点，就是可以把解码后的结果输出到
标准输出。同时它还可以用来给二进制文件打补丁。

.SH "选项 (OPTIONS)"
如果没有给定
.I infile
就用标准输入。如果
.I infile
是一个
.RB “\-”
字符，也从标准输入读入。如果没有给定
.I outfile
（或者它的文件名是 一个
.RB \` \- \'
字符），结果将输出至标准输出。
.PP
注意我们用的是一个很“懒”的解析器，它只检查选项的第一个字符，
除非这个选项有参数。在一个单字符的选项和它的参数之间的空格
可有可无. 选项的 参数 可以 用 十进制, 十六进制 或者 八进制的 形式 指定.
也就是说
.RB \-c8 ,
.BR "\-c 8" ,
.B \-c 010
和
.B \-cols 8
是 等价的.
.PP
.TP
.IR \-a " | " \-autoskip
打开/关闭 autoskip: 用一个 单独的 '*' 来 代替 空行. 默认 关闭.
.TP
.IR \-b " | " \-bits
转到 比特(二进制 数字) 模式, 而 不是 十六进制 模式. 在 这种 模式 下,
每个 字符 被 表示成 八个 0/1 的 数字, 而 不是 一般的 十六进制 形式.
每 一行 都 以 一个 用 十六进制 形式 表示的 行号, 后面 是 ascii (或者 ebcdic)
形式 开头. 命令行 选项 \-r, \-p, \-i 在 这个 模式下 不起作用.
.TP
.IR "\-c cols " | " \-cols cols"
.IR "\-c cols " | " \-cols cols"
每行 表示
.RI < cols >
个 字符. 默认 16 (\-i: 12, \-ps: 30, \-b: 6). 最多 256.
.TP
.IR \-E " | " \-EBCDIC
把 右手边的 字符 编码 从 ASCII 变为 EBCDIC. 这个 并不 改变 其 十六进制
表示 形式. 同 \-r, \-p 或者 \-i 一起用 是 没有 意义的.
.TP
.IR "\-g bytes " | " \-groupsize bytes"
每
.RI < bytes >
个 字符 (每 两个 十六进制 字符 或者 八个 二进制 数字) 之间 用 一个 空格 隔开.
用
.I \-g 0
禁止 分组. 在 普通 模式 中
.RI < Bytes "> 默认 是 " 2
在 二进制 模式 中 是 \fI1\fP. 分组 并不 适用于 postscript 或者
include style 选项.
.TP
.IR \-h " | " \-help
显示 可用 命令 概述 并且 退出. 不做 其它 任何 事情.
.TP
.IR \-i " | " \-include
输出 为 C 语言的 包含 文件 形式. 除非 xxd 从 标准输入 读入, 不然 会 输出 一个
完整的 静态 数组 定义(与 输入 文件 同名).
.TP
.IR "\-l len " | " \-len len"
输出
.RI  < len >
个 字符 后 停止.
.TP
.IR \-p " | " \-ps " | " \-postscript " | " \-plain
以 postscript 的 连续 十六进制 转储 输出. 这 也叫做 纯 十六进制 转储.
.TP
.IR \-r " | " \-revert
逆向 操作: 把 十六进制 转储 转换 (或者 打补丁) 成 二进制 形式. 如果 不 输出 到
标准输出, xxd 并不把 输出 文件 截断, 而是 直接 写到 输出 文件. 用
.I \-r \-p
来 从 一个 没有 行号 没有 某种 列格式 的 纯 十六进制 转储 读入. 附加的 空格
和 换行 可以 出现 在 任何 地方.
.TP
.I \-seek offset
用在
.I \-r
之后: 会在 当前 文件的 偏移量 上 增加
.RI < offset > .
.TP
.I \-s [\+][\-]seek
从 infile 的 绝对 或者 相对 偏移量
.RI < seek >
开始.
\fI\+ \fR 表示 相对于 标准 输入 当前的 位置 (如果 不是 标准输入 就
没有 意义了). \fI\- \fR 表示 从 文件 末尾 (如果 和 \fI \+ \fR 连用:
从 标准输入 当前 位置) 向前 数 一些 字符, 从 那个
地方 开始. 如果 没有 \-s 选项, xxd 从 当前 位置 开始.
.TP
.I \-u
用大写字母. 默认的是小写字母.
.TP
.IR \-v " | " \-version
显示 版本 字符串.

.SH "告诫 (CAVEATS)"
.PP
.I xxd \-r
在 对待 行号 上 有一些 地方 值得 注意. 如过 输出 文件 可以 定位,
那么 在 十六进制 文件 中的 行首的 行号 可以 重叠, 顺序 可以 打乱,
还 可以 略去 一些 行号. 这种 情况 下, xxd 会 用 lseek(2) 来 定位.
如果 输出 文件 不可以 定位, 那么 行号 可以 不连续, 但是 必须 按
顺序, 这种 情况 下, 中间 会 插入 null 字符.
.PP
.I xxd \-r
从不 输出 解析 错误. 错误 会 被跳过.
.PP
在 编辑 十六进制 文件时 要 注意
.I xxd \-r
在 读入 足够列 之后 会跳过 本行 后面 所有的 数据 (见 选项 \-c).
这 就是说 对可打印的 ASCII (或者 EBCDIC) 的修改 都会被 忽略. 用
xxd \-r \-p 把一个 纯十六进制 转储文件 (或者 postscript) 恢复 成
二进制文件 与 列数 是否 正确 没有 什么 关系, 它会 解释 所有 看起来
像 两个 十六进制的 数字.
.PP
请 注意
.br
\fI% xxd \-i file\fR
.br
和
.br
\fI% xxd \-i \< file\fR
的 区别.
.PP
因为 lseek(2) 是 用来 重置 输入指针的, 所以
.I xxd \-s \+seek
和
.I xxd \-s seek
是 有区别的. 如果 输入 是 标准输入, 并且 在 xxd 被执行是 它的 标准输入的 指针
位置 不是在 文件的 开头, 那么 多了个 '+' 效果 就会 不一样了. 下面的 例子 可能
帮助你 弄清楚(也可能 让你 更糊涂)...
.PP
在读 之前 需要 重置 输入的 文件指针; 因为 `cat' 已经 读到了 输入的 文件尾.
.br
\fI% sh \-c 'cat > plain_copy; xxd \-s 0 > hex_copy' < file
.PP
从 0x480 (=1024+128) 开始读. `+' 表明 "相对于 当前的 文件位置", 也就是说
从 dd 读了 1k, 在此 基础上 再加 `128'.
.br
\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file
.PP
从 0x100 ( = 1024-768) 开始读.
.br
\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file
.PP
可是, 这种 情况 很少 发生, 我们 也 很少 需要用 `+'. 当用了 \-s 是, 作者 比较
喜欢 用 strace(1) 或者 truss(1) 去 监控 xxd 的 行为.

.SH "例子 (EXAMPLES)"
.PP
.br
(译者: 实际 输出 可能 和 例子 有 一些 出入, 只要 理解 其 意思 就行了)
.br
显示 \fBfile\fP 除了 前 三行 (十六进制 的 0x30) 的 所有 内容.
.br
\fI% xxd \-s 0x30 file
.PP
.br
显示 \fBfile\fP 最后 三行 (十六进制 的 0x30) 的 所有 内容.
.br
\fI% xxd \-s \-0x30 file
.PP
.br
显示 120 个 字符, 每行 20 个 字符, 连续 显示.
.br
\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
.br
2e544820585844203120224d616e75616c207061
.br
676520666f7220787864220a2e5c220a2e5c2220
.br
32317374204d617920313939360a2e5c22204d61
.br
6e207061676520617574686f723a0a2e5c222020
.br
2020546f6e79204e7567656e74203c746f6e7940
.br
7363746e7567656e2e7070702e67752e6564752e
.br

.br
显示 120 个 字符, 每行 12 个 字符.
.br
\fI% xxd \-l 120 \-c 12 xxd.1\fR
.br
0000000: 2e54 4820 5858 4420 3120 224d  .TH XXD 1 "M
.br
000000c: 616e 7561 6c20 7061 6765 2066  anual page f
.br
0000018: 6f72 2078 7864 220a 2e5c 220a  or xxd"..\\".
.br
0000024: 2e5c 2220 3231 7374 204d 6179  .\\" 21st May
.br
0000030: 2031 3939 360a 2e5c 2220 4d61   1996..\\" Ma
.br
000003c: 6e20 7061 6765 2061 7574 686f  n page autho
.br
0000048: 723a 0a2e 5c22 2020 2020 546f  r:..\\"    To
.br
0000054: 6e79 204e 7567 656e 7420 3c74  ny Nugent <t
.br
0000060: 6f6e 7940 7363 746e 7567 656e  ony@sctnugen
.br
000006c: 2e70 7070 2e67 752e 6564 752e  .ppp.gu.edu.
.PP
.br
只 显示 xxd.1 中 的 日期.
.br
\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
.br
0000028: 3231 7374 204d 6179 2031 3939  21st May 199
.PP
.br
把
.B input_file
考到
.B output_file
并 在 前面 增加 100 个 字节的 0x00.
.br
\fI% xxd input_file | xxd \-r \-s 100 \> output_file\fR
.br

.br
给 文件 xxd.1 中的 日期 打 补钉.
.br
\fI% echo '0000029: 3574 68' | xxd \-r \- xxd.1\fR
.br
\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
.br
0000028: 3235 7468 204d 6179 2031 3939  25th May 199
.PP
.br
建立 一个 65537 字节的 文件, 所有 字节 都是 0x00,
除了 最后 一个 字节 是 'A' (十六进制 0x41).
.br
\fI% echo \'010000: 41\' | xxd \-r \> file\fR
.PP
.br
打开 autoskip, 显示 上例 中 建立的 文件.
.br
\fI% xxd \-a \-c 12 file\fR
.br
0000000: 0000 0000 0000 0000 0000 0000  ............
.br
*
.br
000fffc: 0000 0000 40                   ....A
.PP
建立 一个 只 含有 一个 'A' 的 文件. '\-r \-s' 后面 的
数字 同 文件 中的 行号 相 抵消; 结果是 开头 的 字节 被
跳过了.
.br
\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR
.PP
在 编辑器, 比如
.B vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用 十六进制 来 显示
被 标记 为 'a' 和 'z' 中间 的 区域.
.br
\fI:'a,'z!xxd\fR
.PP
在 编辑器, 比如
.B vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复 
被 标记 为 'a' 和 'z' 中间 的 区域 的 十六进制 显示.
.br
\fI:'a,'z!xxd \-r\fR
.PP
在 编辑器, 比如
.B vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复 一行的
十六进治 显示. 把 光标 移动 到 相应行 并 键入:
.br
\fI!!xxd \-r\fR
.PP
从 串行线 中 读入 一个个的 单独的 字符.
.br
\fI% xxd \-c1 < /dev/term/b &\fR
.br
\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
.br
\fI% echo \-n foo > /dev/term/b\fR
.PP

.SH "返回值 (RETURN VALUES)"
此 程序 返回 如下的 错误码:
.TP
0
一切 正常.
.TP
\-1
不支持 此 操作 (
.I xxd \-r \-i
仍然 不行).
.TP
1
解析 选项 错误.
.TP
2
输入 文件 出错.
.TP
3
输出 文件 出错.
.TP
4,5
指定 的 偏移量 地址 不可 到达.

.SH "参见 (SEE ALSO)"
uuencode(1), uudecode(1), patch(1)
.br

.SH "警告 (WARNINGS)"
这个 工具 古怪的 念头 是其 作者的 意思. 使用 这个 工具的 任何 结果 都由 自己
负责. 使用它, 探索它, 你 终会 成为 一个 高手.
.br

.SH "版本 (VERSION)"
此 手册页 为 1.7 版本的 xxd 而写.

.SH "作者 (AUTHOR)"
.br
(c) 1990-1997 by Juergen Weigert
.br
<jnweiger@informatik.uni-erlangen.de>
.LP
Distribute freely and credit me,
.br
make money and share with me,
.br
lose money and don't ask me.
.PP
Tony Nugent 
.br
<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
最先 开始 写 本 手册页
.br
Bram Moolenaar 做了一些小的改动，
Juergen Weigert 完成了手册页的编写。
.PP

.SH "[中文版维护人]"
.B 唐友 \<tony_ty@263.net\>
.SH "[中文版最新更新]"
.BR 2002/1/22
.SH "[中国Linux论坛man手册页翻译计划]"
.BI http://cmpp.linuxforum.net
